package com.aqie.libfactory.net;

import com.aqie.libfactory.model.api.PageList;
import com.aqie.libfactory.model.api.RspModel;
import com.aqie.libfactory.model.api.account.AccountRspModel;
import com.aqie.libfactory.model.api.account.LoginModel;
import com.aqie.libfactory.model.api.chat.ChatPermission;
import com.aqie.libfactory.model.api.chat.UnReadMessage;
import com.aqie.libfactory.model.api.file.FileModel;
import com.aqie.libfactory.model.api.friend.FriendListModel;
import com.aqie.libfactory.model.api.post.Comment;
import com.aqie.libfactory.model.api.post.Comment2;
import com.aqie.libfactory.model.api.post.FindPost;
import com.aqie.libfactory.model.api.post.Post;
import com.aqie.libfactory.model.api.user.RegisterModel;
import com.aqie.libfactory.model.api.user.UserComplainModel;
import com.aqie.libfactory.model.api.user.UserPost;
import com.aqie.libfactory.model.db.User;

import java.util.List;
import java.util.Map;

import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.PartMap;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * 网络请求的所有的接口
 */
public interface RemoteService {

    /**
     * 1.注册接口
     *
     * @param model 传入的是RegisterModel
     * @return 返回的是RspModel<AccountRspModel>
     */
    @POST("user/register")
    Call<RspModel<Boolean>> accountRegister(@Body RegisterModel model);

    /**
     * 2.登录接口
     *
     * @param model LoginModel
     * @return RspModel<AccountRspModel>
     */
    @POST("user/login")
    Call<RspModel<AccountRspModel>> accountLogin(@Body LoginModel model);


    /**
     * 3.发送登录验证码
     * @param phone
     * @param type
     * @return
     */
    @POST("user/code/send")
    @FormUrlEncoded
    Call<RspModel<String>> smsLogin(@Field("phone") String phone,@Field("type") Integer type);

    /**
     * 4.我的主页
     */
    @GET("mine/base")
    Call<RspModel<User>> mineBase();

    /**
     * 5.我的动态
     */
    @GET("mine/post")
    Call<RspModel<PageList<UserPost>>> minePost(@Query("pageNum") Integer pageNum,
                                                @Query("pageSize") Integer pageSize);

    /**
     * 6.更新个人信息
     */
    @POST("mine/update")
    Call<RspModel<Boolean>> mineUpdate(@Body User userInfoModel);


    /**
     * 好友
     */

    /**
     * 7.好友页面 综合数据
     */
    @GET("friend")
    Call<RspModel<FriendListModel>> friend();

    /**
     * 8.好友列表
     */
    @GET("friend/list")
    Call<RspModel<List<User>>> friendList(@Query("keyword") String keyword);

    /**
     * 9.设置好友权限
     */
    @POST("friend/permission")
    @FormUrlEncoded
    Call<RspModel<Boolean>> friendPermission(@Field("friendId") String friendId,
                                                         @Field("unLook")Boolean unLook,
                                                         @Field("unSetLook")Boolean unSetLook);

    /**
     * 10.推荐好友列表
     */
    @GET("friend/recommended/list")
    Call<RspModel<List<User>>> friendRecommendedList();

    /**
     * 11.同意好友申请接口
     */
    @POST("friend/request/agree")
    @FormUrlEncoded
    Call<RspModel<Boolean>> friendRequestAgree(@Field("friendId") String friendId,
                                               @Field("markName") String markName);

    /**
     * 12.拒绝好友申请接口
     */
    @POST("friend/request/refuse")
    @FormUrlEncoded
    Call<RspModel<Boolean>> friendRequestRefuse(@Field("friendId") String friendId);

    /**
     * 13.发送好友申请接口
     */
    @FormUrlEncoded
    @POST("friend/request/send")
    Call<RspModel<Boolean>> friendRequestSend(@Field("friendId") String friendId,
                                                @Field("markName") String markName,
                                                @Field("remark") String remark);

    /**
     * 14.获取好友请求列表
     */
    @GET("friend/request/list")
    Call<RspModel<List<User>>> friendRequestList();


    @GET("friend/msg/unRead")
    Call<RspModel<List<UnReadMessage>>> unReadMsgList();

    @FormUrlEncoded
    @POST("friend/deleted")
    Call<RspModel<Boolean>> deleteFriend(@Field("friendId") String friendId);


    /**
     * 15.人才 列表
     */

    @GET("talents")
    Call<RspModel<PageList<User>>> talents(@Query("keyword")String keyword,
                                             @Query(value = "pageNum") Integer pageNum,
                                             @Query("pageSize") Integer pageSize);

    /**
     * 16. 人才主页信息
     */
    @GET("talents/base")
    Call<RspModel<User>> talentBase(@Query("talentsId") String talentsId);

    /**
     * 17.是否加入黑名单
     */
    @POST("talents/blacklist")
    Call<RspModel<Boolean>> talentsBlacklist(@Query("talentsId") String talentsId,
                                             @Query("blacklist") Boolean blacklist);
    /**
     * 18.人才主页的动态
     */
    @GET("talents/post")
    Call<RspModel<PageList<UserPost>>> talentsPost(@Query("talentsId") String talentsId,
                                                   @Query("pageNum")Integer pageNum,
                                                   @Query("pageSize")Integer pageSize);

    /**
     * 19.动态点赞
     */
    @POST("post/like")
    @FormUrlEncoded
    Call<RspModel<Boolean>> postLike(@Field("postId") String postId);

    /**
     * 20.发布动态
     */
    @POST("post/publish")
    Call<RspModel<Boolean>> postPublish(@Body Post post);

    /**
     * 21.动态取消点赞
     */
    @POST("post/un/like")
    @FormUrlEncoded
    Call<RspModel<Boolean>> postUnlike(@Field("postId") String postId);

    /**
     * 商聊
     */
    /**
     * 22.用户权限获取
     */
    @GET("chat/permission")
    Call<RspModel<ChatPermission>> chatPermission(@Query("talentsId") String talentsId);

    /**
     * 评论
     */
    /**
     * 23.获取评论/回复列表
     */
    @GET("comment/list")
    Call<RspModel<List<Comment2>>> commentList(@Query("postId") String postId);

    @GET("post/detail")
    Call<RspModel<UserPost>> postDetail(@Query("postId") String postId);

    /**
     * 24.发表评论
     */
    @POST("comment/new")
    Call<RspModel<Boolean>> commentNew(@Body Comment comment);

    /**
     * 文件
     */

    /**
     * 25.单文件上传
     */
    @Multipart
    @POST("file/upload")
    Call<RspModel<FileModel>> upload(@Part MultipartBody.Part file);


    /**
     * 26.多文件上传
     */
    @Multipart
    @POST("file/upload/batch")
    Call<RspModel<List<FileModel>>> fileUploadBatch(@PartMap Map<String, RequestBody> file);

    /**
     * 27.文件下载
     */
    @Multipart
    @GET("file/download")
    Call<RspModel<FileModel>> fileDownload(@Query("key") String key);


    /**
     * 28 发现列表  动态
     */
    @GET("post/page")
    Call<RspModel<PageList<FindPost>>> postPage(@Query("pageNum") Integer pageNum,
                                                @Query("pageSize") Integer pageSize);

    /**
     * 绑定设备Id
     *
     * @param pushId 设备Id
     * @return RspModel<AccountRspModel>
     */
    @POST("user/bind/{pushId}")
    Call<RspModel<AccountRspModel>> accountBind(@Path(encoded = true, value = "pushId") String pushId);


    /**
     * 29 用户投诉
     * @return
     */
    @POST("complaint/add")
    Call<RspModel<Boolean>> complaintAdd(@Body UserComplainModel userComplainModel);

    /**
     * app埋点统计
     * @param type
     * @return
     */
    @FormUrlEncoded
    @POST("user/statistics")
    Call<RspModel<Boolean>> userStatistics(@Field("type") String type);
}
